package xing.repository.page.custom;

import com.querydsl.core.Tuple;
import com.querydsl.core.types.CollectionExpression;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQuery;
import xing.domain.page.*;
import xing.domain.page.dto.ModuleItemDto;
import xing.domain.page.dto.ModuleList;
import xing.repository.BaseRepository;
import static com.querydsl.core.group.GroupBy.*;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/*******************************************************************************************
 * 类描述：  
 *
 * @author: dustin
 * @date： 2017-8-15 19:30
 * @Description:
 * @version 1.0.0
 *
 *
 * Version    Date       ModifiedBy                 Content  
 * -------- ---------    ----------         ------------------------  
 * 1.0.0     2017-8-15    Administrator                            
 *******************************************************************************************
 */
public class PageModuleRepositoryImpl extends BaseRepository implements PageModuleRepositoryCus {
    /**
    * @Description: get template module summery list
    * @param:  * @param
    * @Author: dustin
    * @Date: 2017-8-15
    */
    @Override
    public List<ModuleList> getSummeryList(String type, String companycode) {
        QPageModule qModule=QPageModule.pageModule;
        QPageModuleItem qModuleItem=QPageModuleItem.pageModuleItem;
        List<ModuleList> list=
        queryFactory.select(
                Projections.fields(ModuleList.class, qModule.id, qModule.name, qModule.showtype,
                        ExpressionUtils.as(JPAExpressions.select(qModuleItem.count())
                                .from(qModuleItem).where(qModuleItem.moduleid.longValue().eq(qModule.id.longValue())), "itemcount"
                        )
                )
        ).from(qModule)
        .where(qModule.companycode.eq(companycode).and(qModule.type.eq(type)))
        .fetch();

        return list;
    }

    @Override
    public PageModule getModuleDetail(long moduleId) {
        QPageModule qModule=QPageModule.pageModule;
        QPageModuleItem qModuleItem=QPageModuleItem.pageModuleItem;
        QPageContentItem qContentItem=QPageContentItem.pageContentItem;

//        PageModule pageModule=
//                queryFactory.select(
//                        Projections.fields(PageModule.class, qModule.id,qModule.templateid, qModule.name, qModule.type,
//                                qModule.level,qModule.showtype,qModule.sort,qModule.padding,qModule.backcolor,qModule.titleisshow,
//                                qModule.titlecolor,qModule.titlebackcolor,qModule.companycode,qModule.created,
//                                ExpressionUtils.as(JPAExpressions.select(qModuleItem)
//                                        .rightJoin(qModule).on(qModule.id.eq(qModuleItem.id))
//                                        , "moduleItems"
//                                )
//                        )
//                )
//                        .from(qModule)
//                        .where(qModule.id.longValue().eq(moduleId))
//                .fetchOne();

        List<Tuple> ts=queryFactory.select(qModule,
                Projections.fields(ModuleItemDto.class, qModuleItem.id, qContentItem.id.as("contentid"), qModuleItem.moduleid, qModuleItem.sort,
                        qContentItem.title,qContentItem.imageurl,qContentItem.size,qContentItem.target,qContentItem.type,qModuleItem.reftype)
                )
                .from(qModule).leftJoin(qModuleItem)
                .on(qModule.id.eq(qModuleItem.moduleid))
                .from(qModuleItem).leftJoin(qContentItem)
                .on(qModuleItem.contentid.longValue().eq(qContentItem.id.longValue()))
                .where(qModule.id.eq(moduleId))
                .fetch();

        if(ts.size()==0) return null;

        PageModule pageModule=ts.get(0).get(qModule);
        for(Tuple t:ts){
            ModuleItemDto m=t.get(1,ModuleItemDto.class);
            if(m.getId()!=null && m.getId()>0)
                pageModule.getModuleItems().add(m);
        }
        Collections.sort(pageModule.getModuleItems());
        return pageModule;
    }
}
